//////////////////////////////////////////////////////////////////////////////////
// Cloud Zoom V1.0.2
// (c) 2010 by R Cecco. <http://www.professorcloud.com>
// MIT License
//
// Please retain this copyright header in all versions of the software
//////////////////////////////////////////////////////////////////////////////////
(function($) {
    $(document).ready(function() {
        $('.cloud-zoom, .cloud-zoom-gallery').CloudZoom()
    });
    function format(str) {
        for (var i = 1; i < arguments.length; i++) {
            str = str.replace('%' + (i - 1), arguments[i])
        }
        return str
    }
    function CloudZoom(jWin, opts) {
        var sImg = $('img', jWin);
        var img1;
        var img2;
        var zoomDiv = null;
        var $mouseTrap = null;
        var lens = null;
        var $tint = null;
        var softFocus = null;
        var $ie6Fix = null;
        var zoomImage;
        var controlTimer = 0;
        var cw, ch;
        var destU = 0;
        var destV = 0;
        var currV = 0;
        var currU = 0;
        var filesLoaded = 0;
        var mx, my;
        var ctx = this, zw;
        setTimeout(function() {
            if ($mouseTrap === null) {
                var w = jWin.width();
                jWin.parent().append(format('<div style="width:%0px;position:absolute;top:75%;left:%1px;text-align:center" class="cloud-zoom-loading" >Loading...</div>', w / 3, (w / 2) - (w / 6))).find(':last').css('opacity', 0.5)
            }
        }, 200);
        var ie6FixRemove = function() {
            if ($ie6Fix !== null) {
                $ie6Fix.remove();
                $ie6Fix = null
            }
        };
        this.removeBits = function() {
            if (lens) {
                lens.remove();
                lens = null
            }
            if ($tint) {
                $tint.remove();
                $tint = null
            }
            if (softFocus) {
                softFocus.remove();
                softFocus = null
            }
            ie6FixRemove();
            $('.cloud-zoom-loading', jWin.parent()).remove()
        };
        this.destroy = function() {
            jWin.data('zoom', null);
            if ($mouseTrap) {
                $mouseTrap.unbind();
                $mouseTrap.remove();
                $mouseTrap = null
            }
            if (zoomDiv) {
                zoomDiv.remove();
                zoomDiv = null
            }
            this.removeBits()
        };
        this.fadedOut = function() {
            if (zoomDiv) {
                zoomDiv.remove();
                zoomDiv = null
            }
            this.removeBits()
        };
        this.controlLoop = function() {
            if (lens) {
                var x = (mx - sImg.offset().left - (cw * 0.5)) >> 0;
                var y = (my - sImg.offset().top - (ch * 0.5)) >> 0;
                if (x < 0) {
                    x = 0
                } else if (x > (sImg.outerWidth() - cw)) {
                    x = (sImg.outerWidth() - cw)
                }
                if (y < 0) {
                    y = 0
                } else if (y > (sImg.outerHeight() - ch)) {
                    y = (sImg.outerHeight() - ch)
                }
                lens.css({left: x, top: y});
                lens.css('background-position', (-x) + 'px ' + (-y) + 'px');
                destU = (((x) / sImg.outerWidth()) * zoomImage.width) >> 0;
                destV = (((y) / sImg.outerHeight()) * zoomImage.height) >> 0;
                currU += (destU - currU) / opts.smoothMove;
                currV += (destV - currV) / opts.smoothMove;
                zoomDiv.css('background-position', (-(currU >> 0) + 'px ') + (-(currV >> 0) + 'px'))
            }
            controlTimer = setTimeout(function() {
                ctx.controlLoop()
            }, 30)
        };
        this.init2 = function(img, id) {
            filesLoaded++;
            if (id === 1) {
                zoomImage = img
            }
            if (filesLoaded === 2) {
                this.init()
            }
        };
        this.init = function() {
            $('.cloud-zoom-loading', jWin.parent()).remove();
            $mouseTrap = jWin.parent().append(format("<div class='mousetrap' style='background-image:url(\".\");z-index:999;position:absolute;width:%0px;height:%1px;left:%2px;top:%3px;\'></div>", sImg.outerWidth(), sImg.outerHeight(), 0, 0)).find(':last');
            $mouseTrap.bind('mousemove', this, function(event) {
                mx = event.pageX;
                my = event.pageY
            });
            $mouseTrap.bind('mouseleave', this, function(event) {
                clearTimeout(controlTimer);
                if (lens) {
                    lens.fadeOut(299)
                }
                if ($tint) {
                    $tint.fadeOut(299)
                }
                if (softFocus) {
                    softFocus.fadeOut(299)
                }
                zoomDiv.fadeOut(300, function() {
                    ctx.fadedOut()
                });
                return false
            });
            $mouseTrap.bind('mouseenter', this, function(event) {
                mx = event.pageX;
                my = event.pageY;
                zw = event.data;
                if (zoomDiv) {
                    zoomDiv.stop(true, false);
                    zoomDiv.remove()
                }
                var xPos = opts.adjustX, yPos = opts.adjustY;
                var siw = sImg.outerWidth();
                var sih = sImg.outerHeight();
                var w = opts.zoomWidth;
                var h = opts.zoomHeight;
                if (opts.zoomWidth == 'auto') {
                    w = siw
                }
                if (opts.zoomHeight == 'auto') {
                    h = sih
                }
                var appendTo = jWin.parent();
                switch (opts.position) {
                    case'top':
                        yPos -= h;
                        break;
                    case'right':
                        xPos += siw;
                        break;
                    case'bottom':
                        yPos += sih;
                        break;
                    case'left':
                        xPos -= w;
                        break;
                    case'inside':
                        w = siw;
                        h = sih;
                        break;
                    default:
                        appendTo = $('#' + opts.position);
                        if (!appendTo.length) {
                            appendTo = jWin;
                            xPos += siw;
                            yPos += sih
                        } else {
                            w = appendTo.innerWidth();
                            h = appendTo.innerHeight()
                        }
                }
                zoomDiv = appendTo.append(format('<div id="cloud-zoom-big" class="cloud-zoom-big" style="display:none;position:absolute;left:%0px;top:%1px;width:%2px;height:%3px;background-image:url(\'%4\');z-index:99;"></div>', xPos, yPos, w, h, zoomImage.src)).find(':last');
                if (sImg.attr('title') && opts.showTitle) {
                    zoomDiv.append(format('<div class="cloud-zoom-title">%0</div>', sImg.attr('title'))).find(':last').css('opacity', opts.titleOpacity)
                }
                if ($.browser.msie && $.browser.version < 7) {
                    $ie6Fix = $('<iframe frameborder="0" src="#"></iframe>').css({position: "absolute", left: xPos, top: yPos, zIndex: 99, width: w, height: h}).insertBefore(zoomDiv)
                }
                zoomDiv.fadeIn(500);
                if (lens) {
                    lens.remove();
                    lens = null
                }
                cw = (sImg.outerWidth() / zoomImage.width) * zoomDiv.width();
                ch = (sImg.outerHeight() / zoomImage.height) * zoomDiv.height();
                lens = jWin.append(format("<div class = 'cloud-zoom-lens' style='display:none;z-index:98;position:absolute;width:%0px;height:%1px;'></div>", cw, ch)).find(':last');
                $mouseTrap.css('cursor', lens.css('cursor'));
                var noTrans = false;
                if (opts.tint) {
                    lens.css('background', 'url("' + sImg.attr('src') + '")');
                    $tint = jWin.append(format('<div style="display:none;position:absolute; left:0px; top:0px; width:%0px; height:%1px; background-color:%2;" />', sImg.outerWidth(), sImg.outerHeight(), opts.tint)).find(':last');
                    $tint.css('opacity', opts.tintOpacity);
                    noTrans = true;
                    $tint.fadeIn(500)
                }
                if (opts.softFocus) {
                    lens.css('background', 'url("' + sImg.attr('src') + '")');
                    softFocus = jWin.append(format('<div style="position:absolute;display:none;top:2px; left:2px; width:%0px; height:%1px;" />', sImg.outerWidth() - 2, sImg.outerHeight() - 2, opts.tint)).find(':last');
                    softFocus.css('background', 'url("' + sImg.attr('src') + '")');
                    softFocus.css('opacity', 0.5);
                    noTrans = true;
                    softFocus.fadeIn(500)
                }
                if (!noTrans) {
                    lens.css('opacity', opts.lensOpacity)
                }
                if (opts.position !== 'inside') {
                    lens.fadeIn(500)
                }
                zw.controlLoop();
                return
            })
        };
        img1 = new Image();
        $(img1).load(function() {
            ctx.init2(this, 0)
        });
        img1.src = sImg.attr('src');
        img2 = new Image();
        $(img2).load(function() {
            ctx.init2(this, 1)
        });
        img2.src = jWin.attr('href')
    }
    $.fn.CloudZoom = function(options) {
        try {
            document.execCommand("BackgroundImageCache", false, true)
        } catch (e) {
        }
        this.each(function() {
            var relOpts, opts;
            eval('var        a = {' + $(this).attr('rel') + '}');
            relOpts = a;
            if ($(this).is('.cloud-zoom')) {
                $(this).css({'position': 'relative', 'display': 'block'});
                $('img', $(this)).css({'display': 'block'});
                if ($(this).parent().attr('id') != 'wrap') {
                    $(this).wrap('<div id="wrap" style="top:0px;z-index:9999;position:relative;"></div>')
                }
                opts = $.extend({}, $.fn.CloudZoom.defaults, options);
                opts = $.extend({}, opts, relOpts);
                $(this).data('zoom', new CloudZoom($(this), opts))
            } else if ($(this).is('.cloud-zoom-gallery')) {
                opts = $.extend({}, relOpts, options);
                $(this).data('relOpts', opts);
                $(this).bind('click', $(this), function(event) {
                    var data = event.data.data('relOpts');
                    $('#' + data.useZoom).data('zoom').destroy();
                    $('#' + data.useZoom).attr('href', event.data.attr('href'));
                    $('#' + data.useZoom + ' img').attr('src', event.data.data('relOpts').smallImage);
                    $('#' + event.data.data('relOpts').useZoom).CloudZoom();
                    return false
                })
            }
        });
        return this
    };
    $.fn.CloudZoom.defaults = {zoomWidth: 'auto', zoomHeight: 'auto', position: 'right', tint: false, tintOpacity: 0.5, lensOpacity: 0.5, softFocus: false, smoothMove: 3, showTitle: true, titleOpacity: 0.5, adjustX: 0, adjustY: 0}
})(jQuery);
